package com.lib76.buildCode.control;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.lib76.buildCode.dao.ProjectDao;
import com.lib76.buildCode.dto.AjaxResult;
import com.lib76.buildCode.dto.TableResult;
import com.lib76.buildCode.dto.TreeNode;
import com.lib76.buildCode.model.DbConfig;
import com.lib76.buildCode.model.Menu;
import com.lib76.buildCode.model.PageConfig;
import com.lib76.buildCode.model.PageEntity;
import com.lib76.buildCode.model.PageEntityField;
import com.lib76.buildCode.model.Project;
import com.lib76.buildCode.model.TableEntity;
import com.lib76.buildCode.service.EntityOperateServer;
import com.lib76.buildCode.service.PageConfigServer;
import com.lib76.jsp.HttpServletUtils;

/**
 * 页面配置页面控制
 * @author 张浩
 * @version 0.0.4
 * @since 0.0.3
 */
@Controller
public class PageConfigController {

	@RequestMapping("/pageConfig")
	public String config(String code,Model model){
		if(StringUtils.isNotBlank(code)){
			Project project = ProjectDao.findByCode(code);
			if(project != null && project.getPageConfig() != null){
				model.addAttribute("project", project);
				model.addAttribute("pageConfig", project.getPageConfig());
				return "pageConfig/edit";
			}
		}
		return HttpServletUtils.sendRedirect("/");
	}
	
	@RequestMapping("/pageConfig/tree")
	@ResponseBody
	public List<TreeNode> tree(String code,String pid){
		List<TreeNode> result = new ArrayList<TreeNode>();
		if(StringUtils.isNotBlank(code)){
			Project project = ProjectDao.findByCode(code);
			if(project != null && project.getPageConfig() != null){
				if("entity".equals(pid)){
					for(PageEntity pageEntity:project.getPageConfig().getEntitys().values()){
						TreeNode node = new TreeNode();
						node.setPid("entity");
						node.setId(pageEntity.getEntityClassName());
						node.setName(pageEntity.getEntityChinaName());
						node.setIsLeaf(true);
						result.add(node);
					}
				}else if("menu".equals(pid)){}
			}
			if(StringUtils.isBlank(pid)){
				TreeNode node = new TreeNode();
				node.setId("entity");
				node.setName("实体对象");
				node.setIsLeaf(false);
				result.add(node);
			}
		}
		return result;
	}
	
	@RequestMapping("/pageConfig/type")
	public String type(String code,Model model){
		Project project = ProjectDao.findByCode(code);
		model.addAttribute("project", project);
		return "pageConfig/type";
	}
	
	@RequestMapping("/pageConfig/entity/edit")
	public String EntityEdit(String code,String entityCode,Model model){
		if(StringUtils.isNotBlank(code)){
			Project project = ProjectDao.findByCode(code);
			if(project != null && project.getPageConfig() != null){
				PageEntity pageEntity = null;
				if(StringUtils.isNotBlank(entityCode)){
					pageEntity = project.getPageConfig().getEntitys().get(entityCode);
				}
				if(pageEntity == null){pageEntity = new PageEntity();}
				model.addAttribute("project", project);
				model.addAttribute("pageEntity", pageEntity);
				return "pageConfig/editEntity";
			}
		}
		return HttpServletUtils.sendRedirect("/");
	}
	
	@RequestMapping("/pageConfig/entity/save")
	@ResponseBody
	public AjaxResult EntitySave(PageEntity entity,String projectCode,String id,Model model){
		AjaxResult result = new AjaxResult(0);
		if(StringUtils.isNotBlank(projectCode)){
			Project project = ProjectDao.findByCode(projectCode);
			if(project != null && project.getPageConfig() != null){
				PageEntity temp = project.getPageConfig().getEntitys().remove(id);
				if(temp != null){
					entity.setFields(temp.getFields());
				}
				project.getPageConfig().getEntitys().put(entity.getEntityClassName(), entity);
				EntityOperateServer.udpatePageEntity(project, entity);
				result.setData(entity);
				result.setError(1);
			}else{result.setMsg("无法找到的项目");}
		}else{result.setMsg("无效的项目代码参数");}
		return result;
	}
	
	@RequestMapping("/pageConfig/entity/field/data")
	@ResponseBody
	public TableResult<PageEntityField> entityFieldData(String code,String entityCode){
		TableResult<PageEntityField> result = new TableResult<PageEntityField>();
		if(StringUtils.isNotBlank(code) && StringUtils.isNotBlank(entityCode)){
			Project project = ProjectDao.findByCode(code);
			if(project != null && project.getPageConfig() != null){
				PageEntity pageEntity = project.getPageConfig().getEntitys().get(entityCode);
				if(pageEntity != null){
					result.setData(new ArrayList<PageEntityField>(pageEntity.getFields().values()));
					result.setDataTotal(Long.valueOf(result.getData().size()));
				}
			}
		}
		return result;
	}
	
	@RequestMapping("/pageConfig/entity/field/cell/update")
	@ResponseBody
	public AjaxResult typeSave(String code,String entityCode,String fieldCode,String name,String value){
		AjaxResult result = new AjaxResult(0);
		if(StringUtils.isNotBlank(code) && StringUtils.isNotBlank(entityCode) && StringUtils.isNotBlank(fieldCode)
				&& StringUtils.isNotBlank(name)){
			Project project = ProjectDao.findByCode(code);
			if(project != null && project.getPageConfig() != null){
				PageEntity pageEntity = project.getPageConfig().getEntitys().get(entityCode);
				if(pageEntity!=null){
					PageEntityField pageEntityField = pageEntity.getFields().get(fieldCode);
					try{
						if(pageEntityField != null){
							Field field=PageEntityField.class.getDeclaredField(name);
							if(field != null){
								field.setAccessible(true);
								field.set(pageEntityField, value);
								if(name.equals("name")){
									EntityOperateServer.updatePageEntityField(project, pageEntity, pageEntityField);
								}
								result.setError(1);
							}else{
								result.setMsg("未找到属性："+name);
							}
						}
					}catch(Exception e){
						result.setMsg(e.getMessage());
					}
				}
			}else{result.setMsg("无法找到的项目");}
		}else{result.setMsg("无效的参数");}
		return result;
		
	}
	
	@RequestMapping("/pageConfig/type/save")
	@ResponseBody
	public AjaxResult typeSave(String code,String templateType){
		AjaxResult result = new AjaxResult(0);
		if(StringUtils.isNotBlank(code)){
			Project project = ProjectDao.findByCode(code);
			if(project != null){
				PageConfig pageConfig = new PageConfig(); 
				pageConfig.setTemplateType(templateType);
				DbConfig dbConfig = project.getDbConfig();
				if(dbConfig != null){
					for(TableEntity table:dbConfig.getTables().values()){
						//转换页面并保存 by version 0.0.4
						PageConfigServer.addByTable(pageConfig, table);
					}
				}
				project.setPageConfig(pageConfig);
				result.setError(1);
			}else{result.setMsg("无法找到的项目");}
		}else{result.setMsg("无效的项目代码参数");}
		return result;
	}
}
